home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / vgacodng / part01.txt < prev    next >
Text File  |  1996-08-07  |  10KB  |  202 lines

  1.  
  2.                              VGA-Kurs - Part #1
  3.  
  4. An alle, die sich schon ein bißchen mit Pascal und Assembler auskennen, und
  5. nun unbedingt Spiele, Demos oder anderes in VGA coden möchten! Hier ist der
  6. erste Teil von "T.C.P.'s Beginner's Guide To VGA Coding"(TM)!
  7. (Anmerkung für alle erfahrenen Coder: Ihr müßt das hier natürlich nicht lesen,
  8. da ihr das sowieso schon alles wißt, aber es kann ja nix schaden, gelle? Ach 
  9. so: Falls ich irgendwas falsch mache, könnt ihr mich natürlich berichtigen,
  10. schließlich is ja nobody perfect!)
  11. Wenn meine Annahme stimmt, daß viele Leute so was lesen wollen, werde ich
  12. diese Serie fortsetzen, bekomme ich allerdings nicht genügend Resonanz, werde
  13. ich das Schreiben einstellen.
  14. Ich werde in den ersten Teilen die Grundlagen vermitteln und mich später, bei
  15. genügend Resonanz wie gesagt, auch fortgeschritteneren Teilen der 
  16. VGA-Programmierung annehmen, wie Mode-X, Undokumentierte VGA-Funktionen,
  17. Sprites, HiRes-Coding etc.
  18. Na dann mal ran ans Eingemachte!
  19. Wer Pascal hat, hat vielleicht schon mal ein bißchen mit BGIs rumgecodet.
  20. Inzwischen gibt es zwar auch 256-Farben-BGIs aber trotzdem: Vergeßt es! 
  21. Diese Dinger taugen vielleicht für irgendwelche HiRes-Lame-O-Slow-Anwendungen, 
  22. für die man das Rad (sprich: SVGA-Routinen) nicht neu erfinden will, aber für 
  23. Spiele (geschweige denn Demos) - nej, nej, nej, da brauchts schon n' bisserl 
  24. mehr.
  25. "Also, wie komme ich in den 256-Farben-VGA-Modus, ohne an BGIs auch nur einen
  26. Gedanken zu verschwenden?" werdet ihr jetzt fragen. Die Antwort ist absolut
  27. simpel: Inline Assembler! (Übrigens DAS Demo-Coder-Zauberwort schlechthin!)
  28. Hier also eine Prozedur zum Initialisieren des 256-Farben-Modus:
  29.  
  30. procedure SetMCGAMode;assembler;
  31. asm
  32.   mov     ax,13h
  33.   int     10h
  34. end;
  35.  
  36. Wie ja wohl jeder sehen kann, lädt diese Prozedur das AX-Reg mit 13h und ruft
  37. den VGA-Bios-Interrupt 10h auf.
  38. Die VGA-Karte weiß nun, daß sie in den Modus 13h (320x200 Pixel, 256 Farben)
  39. schalten soll. Was lernen wir daraus? Wir schreiben in AX den Video-Modus,
  40. den wir haben möchten, callen den INT 10h und -baff!- befinden wir uns im
  41. gewünschten Modus. Die Nummer des Standard Textmodus ist übrigens 3h. Hier
  42. eine kleine Übungsaufgabe für zu Hause: Wie komme ich zurück in den Textmodus?
  43. Richtig! Wir ersetzen 13h durch 03h.
  44. Den INT 10h sollte man sich übrigens gut merken, da er später sehr wichtig
  45. werden wird.
  46. So, schön und gut, ich bin im richtigen Modus, aber was jetzt? Beginnen wir
  47. mit der simpelsten Operation im Grafikmodus: Das Setzen eines Pixels!
  48. Zuerst einmal: Was hat ein Pixel für Eigenschaften? 1. X-Koordinate (0-319),
  49. 2. Y-Koordinate (0-199), 3. Farbe (0-255).
  50. Moment mal! War da nicht die Rede von 320x200x256 und nicht 319x199x255?
  51. Tja, das ist so: Der Computer fängt nicht bei 1 an zu zählen wie die meisten
  52. von uns, sondern bei 0. Was also für uns 1 Dose Coke ist, ist für den
  53. Prozessor 0 Dose Coke. Was für uns X-Koord 1 ist, ist für den Compi X-Koord 0.
  54. Alles klar? Der erste Pixel in der obersten Zeile ist also für den Rechner
  55. (0,0), der zweite (1,0), der dritte (2,0), usw. Und so wollen wir es hier in
  56. Zukunft auch halten. Wenn man jetzt also solange weiter macht, bis man bei
  57. Pixel (319,0) angekommen ist, geht man in die nächste Zeile und nach links.
  58. Jetzt hat man Pixel (0,1). Das kann man immer weiter treiben, bis man bei
  59. Pixel (319,199) angekommen ist. Jetzt kennt man jeden Pixel persönlich und
  60. kann sie abends zum Essen einladen ;-).
  61. Wie ihr wahrscheinlich schon bemerkt habt, werden Pixel-Koordinaten
  62. folgendermaßen angegeben: (X-Wert,Y-Wert).
  63. Damit ihr es euch besser vorstellen könnt, hier noch einmal bildlich:
  64.  
  65.         X
  66.  0,0──────────> 319,0
  67.   │           :
  68.   │           :
  69. Y │           :
  70.   │           :
  71.   │           :
  72.   V············
  73. 0,199       319,199
  74.  
  75. Mit der Farbe verhält es sich genauso. Versucht dieses um 1 verschobene
  76. System zu verinnerlichen, weil ihr nicht drum herumkommen werdet.
  77. So, puh (Schweiß-von-der-Stirn-wisch), das hätten wir, aber wie setze ich
  78. jetzt einen Pixel?
  79. Da hilft uns unser alter Freund, der INT 10h.
  80. (Anmerkung für alle erfahrenen Coder: Keine Panik, wir werden auch noch die
  81. Variante kennenlernen, die ohne das Bios auskommt.)
  82. Hier also eine Prozedur, die einen Pixel an die gewünschte Stelle in der
  83. gewünschten Farbe setzt:
  84.  
  85. procedure PutPixel(x,y:integer;col:byte);assembler;
  86. asm
  87.   mov     ah,0Ch
  88.   mov     al,col
  89.   mov     cx,x
  90.   mov     dx,y
  91.   int     10h
  92. end;
  93.  
  94. Will man also einen weißen (Farbe 31) Pixel an (55,120) setzen ruft man die
  95. Prozedur mit
  96.  
  97. PutPixel(55,120,31);
  98.  
  99. auf. Dieser Befehl schreibt nun ins AH-Reg die Funktionsnummer, in AL die
  100. gewünschte Farbnummer, in CX und DX die X- und Y-Koords. Anschließend wird
  101. der INT 10h bemüht, die Arbeit zu übernehmen. Nun sehen wir im unteren linken
  102. Viertel des Bildschirms einen weißen Punkt (vorrausgesetzt, wir befinden uns
  103. im Modus 13h). Nun, dieses Wissen öffnet uns die Tore zu vielen kleinen
  104. Spielereien, die ihr euch jetzt zu Hause ausdenken könnt. Wir könnten zum
  105. Bleistift den gesamten Bildschirm mit Pixeln in beliebigen Farben zuknallen.
  106.  
  107. program FillScreen;
  108. uses crt;
  109. var n1,n2 : integer;
  110. :
  111. : (Hier stehen die oben
  112. : besprochenen Prozeduren)
  113. :
  114. begin
  115.   randomize;
  116.   SetMCGAMode;
  117.   for n1 := 0 to 319 do
  118.     for n2 := 0 to 199 do PutPixel(n1,n2,random(256));
  119.   readkey;
  120.   SetTextMode;
  121. end.
  122.  
  123. Schön, nich? Jetzt haben wir einen zugemüllerten Screen. Aber wie kriegen wir
  124. ihn wieder leer? Ist schließlich nicht sooo schön auf Dauer!
  125. Die ganz schlauen werden jetzt sagen: "Ist doch ganz einfach! Ich ersetze das
  126. "random(256)" durch "0"!" Tja, auch ne Lösung, aber so einfach wollen wirs uns
  127. nun auch nicht machen. Außerdem wäre diese Lösung viel zu langsam, und damit
  128. so unbrauchbar wie ein MS-Produkt ;-). Also, hier die bessere (und schnellere)
  129. Lösung:
  130.  
  131. procedure ClrVGA(col:byte);
  132. begin
  133.   fillchar(mem[$A000:0],64000,col);
  134. end;
  135.  
  136. Hier ausnahmsweise mal kein Assembler sondern ein Standard-Pascal-Befehl am
  137. Werk. Er füllt den Speicherbereich ab A000h:0 (64000 Byte, hier blendet die
  138. VGA ihren Bildschirmspeicher ein, 320 x 200 = 64000) mit der Farbnummer in
  139. "Col" auf. Ihr könnt den Screen also in jeder beliebigen Farbe löschen, aber
  140. am gebräuchlichsten ist wohl 0 (Schwarz).
  141. Jetzt wo wir schon etwas mehr bewandelt sind, können wir uns der Verfeinerung
  142. unseres Wissens widmen. Zum Beilpils: Warum ist unsere PutPixel-Prozedur so
  143. langsam? Ganz einfach: Sie benutzt das Bios! Wenn wir mit dieser Prozedur ein 
  144. Spiel oder sogar ein Demo machen wollten, würden wir wahrscheinlich nicht 
  145. besonders weit kommen! Will man also wirklich geschwindigkeitsoptimiert coden,
  146. muß man meistens einen anderen, unbequemeren Weg als das VGA-Bios benutzen.
  147. In diesem Fall können wir die Prozedur erheblich beschleunigen, wenn wir die
  148. Pixel-Daten direkt in den Bildschirmspeicher schreiben. Erinnert ihr euch?
  149. Der Bildschirmspeicher im Modus 13h ist ein 64000(320x200)Byte großer
  150. Speicherbereich an der Adresse A000h:0. In diesem Bereich stehen die
  151. Farbwerte sämtlicher Pixel auf dem VGA-Screen. In den ersten 320 Byte stehen
  152. also die Farbwerte aller Pixel der ersten VGA-Zeile hintereinander. Die
  153. nächsten 320 Byte beinhalten die Werte der nächsten Zeile, usw. bis zum
  154. letzten Pixel, dessen Farbwert an Adresse A000h:63999 steht. Da wir dies nun 
  155. wissen, können wir mit Hilfe der Formel
  156.  
  157. Byte-Adresse = 320 x Y-Koord + X-Koord
  158.  
  159. berechnen, welche Adresse welcher Pixel einnimmt. Hier also die optimierte
  160. PutPixel-Routine:
  161.  
  162. procedure PutPixel(x,y:integer;col:byte);
  163. begin
  164.   mem[$A000:320*y+x] := col;
  165. end;
  166.  
  167. Wer diese Prozedur nun in unser "FillScreen"-Proggi einbaut, wird die
  168. erhebliche Geschwindigkeitssteigerung bemerken. Aber es geht noch schneller!
  169. Und zwar, indem man nie Prozedur in Assembler schreibt (War ja klar! ;-).
  170. Aber das überlasse ich euch für zu Hause, schließlich sollt ihr auch mal
  171. selber was machen. Geübte Coder können bestimmt noch ein paar Clocks
  172. raushauen.
  173. So, das wars dann fürs Erste von "T.C.P.'s Beginner's Guide To VGA
  174. Coding"(TM)! Ich hoffe, es hat euch was gebracht, und ich bekomme reichlich
  175. Feedback. Gebt auch eure Wünsche an, was ihr auf jeden Fall in einer der
  176. Ausgaben besprochen sehen wollt. Ich schreibe diesen Kurs gerne, aber nur wenn
  177. sich auch genug Leute dafür interessieren, sonst kann ich mir die Arbeit
  178. sparen! Also, schreibt was!
  179.  
  180.  
  181.  
  182.  
  183.  
  184. [ This text copyright (c) 1995-96 Johannes Spohr. All rights reserved. ]
  185. [ Distributed exclusively through PC-Heimwerker, Verlag Thomas Eberle. ]
  186. [                                                                      ]
  187. [ No  part   of  this   document  may  be   reproduced,   transmitted, ]
  188. [ transcribed,  stored in a  retrieval system,  or translated into any ]
  189. [ human or computer language, in any form or by any means; electronic, ]
  190. [ mechanical,  magnetic,  optical,   chemical,  manual  or  otherwise, ]
  191. [ without the expressed written permission of the author.              ]
  192. [                                                                      ]
  193. [ The information  contained in this text  is believed  to be correct. ]
  194. [ The text is subject to change  without notice and does not represent ]
  195. [ a commitment on the part of the author.                              ]
  196. [ The author does not make a  warranty of any kind with regard to this ]
  197. [ material, including,  but not limited to,  the implied warranties of ]
  198. [ merchantability  and fitness  for a particular  purpose.  The author ]
  199. [ shall not be liable for errors contained herein or for incidental or ]
  200. [ consequential damages in connection with the furnishing, performance ]
  201. [ or use of this material.                                             ]
  202.